home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Libris Britannia 4
/
science library(b).zip
/
science library(b)
/
UTILITIE
/
CONVERSI
/
1396.ZIP
/
UU.ASM
< prev
next >
Wrap
Assembly Source File
|
1988-09-04
|
11KB
|
318 lines
name UUDECODE
page 55,132
title 'UUDECODE.ASM'
;
; UUDECODE.ASM -- UUDecodes a UUEncoded Binary File
;
; Copyright (C) 1988, by Theodore A. Kaldis
;
; To assemble and link this program into the executable UUDECODE.EXE:
;
; C>MASM UU;
; C>LINK UU;
; C>EXEPACK UU.EXE UUDECODE.EXE
;
;-------------------------------------------
TAB EQU 9
LF EQU 10
CR EQU 13
SPC EQU 20h
CMD_TAIL EQU 80h
;-------------------------------------------
CODE SEGMENT PARA PUBLIC 'CODE'
ASSUME CS:CODE,DS:DSEG,SS:SSEG,ES:DSEG
;-------------------------------------------
UUDECODE PROC FAR
MOV AX,DSEG
MOV ES,AX
MOV SI,CMD_TAIL
MOV DI,OFFSET INP_FILE
CLD
LODSB
CMP AL,0
JE CHK_DOS
STRIP_CT: LODSB
CMP AL,SPC
JBE STRIP_CT
CT_CHAR: CMP AL,SPC
JBE CHK_DOS
STOSB
LODSB
JMP SHORT CT_CHAR
;-------------------------------------------
CHK_DOS: PUSH ES
POP DS
MOV AH,30h
INT 21h
CMP AL,2
JAE PROG_GO
MOV DX,OFFSET MSG_V1
MOV AH,9
INT 21h
MOV AH,0
INT 21h
;-------------------------------------------
PROG_GO: CMP INP_FILE,0
JNE OPEN_INP_FIL
MOV DX,OFFSET PR_INP
MOV CX,PR_INP_LEN
MOV BX,1
MOV AH,40h
INT 21h
MOV DX,OFFSET INP_FILE
MOV CX,40
MOV BX,0
MOV AH,3Fh
INT 21h
MOV BX,AX
SUB BX,2
MOV INP_FILE[BX],0
OPEN_INP_FIL: MOV DX,OFFSET INP_FILE
MOV AX,3D00h
INT 21h
JNC INP_OPEN
JMP INP_ERR
;-------------------------------------------
INP_OPEN: MOV INP_HANDLE,AX
CALL READ_FILE
GET_OUT_FIL: CALL GET_LINE
MOV SI,OFFSET LINE_IN
MOV DI,OFFSET OUT_FILE
LODSB
CMP AL,'b'
JNE GET_OUT_FIL
LODSB
CMP AL,'e'
JNE GET_OUT_FIL
LODSB
CMP AL,'g'
JNE GET_OUT_FIL
LODSB
CMP AL,'i'
JNE GET_OUT_FIL
LODSB
CMP AL,'n'
JNE GET_OUT_FIL
STRIP_SPC: LODSB
CMP AL,' '
JE STRIP_SPC
STRIP_NUM: LODSB
CMP AL,32
JNE STRIP_NUM
GET_OUT: LODSB
CMP AL,32
JE GET_OUT
CMP AL,0
JE OUT_FIN
STOSB
JMP SHORT GET_OUT
;-------------------------------------------
OUT_FIN: MOV DX,OFFSET OUT_FILE
MOV CX,0
MOV LINE_LEN,CL
MOV AH,3Ch
INT 21h
JNC OUT_OPEN
JMP OUT_ERR
;-------------------------------------------
OUT_OPEN: MOV OUT_HANDLE,AX
MOV DI,OFFSET OUT_BUF
NEW_LINE: CALL GET_LINE
MOV SI,OFFSET LINE_IN
LODSB
SUB AL,32
CMP AL,0
JE PROG_END
MOV LINE_LEN,AL
NN_0: LODSB
MOV AH,AL
LODSB
DEC SI
SUB AX,2020h
MOV CL,2
SHL AH,CL
MOV CL,4
SHR AL,CL
OR AL,AH
STOSB
INC BUF_LEN
DEC LINE_LEN
CMP LINE_LEN,0
JNE NN_1
JMP SHORT NEW_LINE
;-------------------------------------------
NN_1: LODSB
MOV AH,AL
LODSB
DEC SI
SUB AX,2020h
MOV CL,4
SHL AH,CL
MOV CL,2
SHR AL,CL
OR AL,AH
STOSB
INC BUF_LEN
DEC LINE_LEN
CMP LINE_LEN,0
JNE NN_2
JMP SHORT NEW_LINE
;-------------------------------------------
NN_2: LODSB
MOV AH,AL
LODSB
SUB AX,2020h
MOV CL,6
SHL AH,CL
OR AL,AH
STOSB
INC BUF_LEN
DEC LINE_LEN
CMP LINE_LEN,0
JNE NN_0
JMP SHORT NEW_LINE
;-------------------------------------------
PROG_END: CALL GET_LINE
MOV SI,OFFSET LINE_IN
LODSB
CMP AL,'e'
JNE END_ERR_C
LODSB
CMP AL,'n'
JNE END_ERR_C
LODSB
CMP AL,'d'
JE FILE_END
END_ERR_C: CALL END_ERR
FILE_END: CALL WRITE_FILE
FILE_END_X: MOV AH,4Ch
INT 21h
;-------------------------------------------
GET_LINE PROC NEAR
MOV POS_STOR,DI
MOV SI,BUF_POS
FLUSH_LIN: MOV DI,OFFSET LINE_IN
MOV CX,80
XOR AL,AL
REP STOSB
MOV DI,OFFSET LINE_IN
NEXT_CHR: LODSB
DEC READ_COUNT
CMP READ_COUNT,0
JA NOT_MT
PUSH AX
CALL WRITE_FILE
CALL READ_FILE
POP AX
NOT_MT: CMP AL,96
JNE NOT_HI
SUB AL,64
NOT_HI: CMP AL,13
JE LAST_CHR
STOSB
INC LINE_LEN
CMP LINE_LEN,80
JNE NEXT_CHR
STRIP_HEAD: LODSB
DEC READ_COUNT
CMP AL,10
JNE STRIP_HEAD
JMP SHORT FLUSH_LIN
;-------------------------------------------
LAST_CHR: INC SI
DEC READ_COUNT
MOV BUF_POS,SI
MOV DI,POS_STOR
RET
GET_LINE ENDP
;-------------------------------------------
WRITE_FILE PROC NEAR
MOV DX,OFFSET OUT_BUF
MOV CX,BUF_LEN
MOV BUF_LEN,0
MOV BX,OUT_HANDLE
MOV AH,40h
INT 21h
JNC WRITE_GOOD
OUT_ERR: PUSH AX
MOV DX,OFFSET ERR_OUT
MOV CX,ERR_OUT_LEN
MOV BX,1
MOV AH,40h
INT 21h
POP AX
JMP FILE_END_X
;-------------------------------------------
WRITE_GOOD: MOV POS_STOR,OFFSET OUT_BUF
RET
WRITE_FILE ENDP
;-------------------------------------------
READ_FILE PROC NEAR
MOV DX,OFFSET DATA_BUF
MOV CX,0FE00h
MOV BX,INP_HANDLE
MOV AH,3Fh
INT 21h
JC INP_ERR
CMP AX,0
JNE READ_CHAR
CALL END_ERR
JMP FILE_END_X
;-------------------------------------------
READ_CHAR: MOV READ_COUNT,AX
MOV SI,OFFSET DATA_BUF
RET
;-------------------------------------------
INP_ERR: PUSH AX
MOV DX,OFFSET ERR_INP
MOV CX,ERR_INP_LEN
MOV BX,1
MOV AH,40h
INT 21h
POP AX
JMP FILE_END_X
READ_FILE ENDP
;-------------------------------------------
END_ERR PROC NEAR
MOV DX,OFFSET ERR_END
MOV CX,ERR_END_LEN
MOV BX,1
MOV AH,40h
INT 21h
RET
END_ERR ENDP
UUDECODE ENDP
CODE ENDS
;-------------------------------------------
DSEG SEGMENT PARA PUBLIC 'DATA'
BUF_START EQU OFFSET DATA_BUF
MSG_V1 DB 'This Program Requires DOS Version 2.0 '
DB 'or higher.',CR,LF,'$'
PR_INP DB CR,LF,'Input path/file: '
PR_INP_LEN EQU $-PR_INP
ERR_INP DB 'Input file error.',CR,LF
ERR_INP_LEN EQU $-ERR_INP
ERR_OUT DB 'Output file error.',CR,LF
ERR_OUT_LEN EQU $-ERR_OUT
ERR_END DB 'End not found.',CR,LF
ERR_END_LEN EQU $-ERR_END
BUF_POS DW BUF_START
INP_HANDLE DW ?
OUT_HANDLE DW ?
READ_COUNT DW 0
BUF_LEN DW 0
POS_STOR DW ?
LINE_LEN DB 0
INP_FILE DB 40 DUP(0)
OUT_FILE DB 15 DUP(0)
LINE_IN DB 80 DUP (?)
OUT_BUF DB 80 DUP (?)
DATA_BUF DB 0FE00h DUP (?)
DSEG ENDS
;-------------------------------------------
SSEG SEGMENT PARA STACK 'STACK'
DW 100 DUP (?)
SSEG ENDS
;-------------------------------------------
END UUDECODE